11.4 Funkcie nad reťazcami
Najčastejšie používané funkcie nad reťazcami sú nasledujúce:
Length(Reťazec)
Funkcia má typ Byte a vracia aktuálnu dĺžku Reťazca.
Copy(Reťazec,Začiatok,Kus)
Funkcia. Vracia časť Reťazca, ktorá sa začína od prvku Začiatok a má dĺžku Kus. Ak Začiatok je väčší, než aktuálna dĺžka, potom výsledok je prázdny reťazec. Napr.
Retazec := 'Žiackypreukaz' ; |
Cast := Copy(Retazec,1,4) ; {Cast='Žiac'} |
Cast := Copy(Retazec,5,6) ; {Cast='kypreu'} |
Cast := Copy(Retazec,10,40) ; {Cast='ukaz'} |
Ak podreťazec má dĺžku 1, potom je vhodnejšie použiť indexáciu miesto funkcie Copy. Je to kratšie a logickejšie:
Copy(Retazec,5,1) = Retazec[5]
Pos(Časť,Reťazec)
Funkcia má typ Byte a vracia prvú pozíciu výskytu podreťazca Časť v reťazci Reťazec. Ak sa nenachádza, potom jej hodnota je 0.
Nasledujúci fragment vyhľadá v reťazci časť 'lu' a vypíše časť reťazca pred ňou:
11.5 Procedúry s reťazcami
Najčastejšie používané procedúry s reťazcami sú nasledujúce:
Delete(Reťazec,Začiatok,Kus) ;
Procedúra, ktorá vymaže z Reťazca počet znakov Kus od pozície Začiatok. Objekt Reťazec musí byť premennou, ktorý sa zmení - bude kratší. Ak Začiatok je väčší, než aktuálna dĺžka premennej Reťazec, potom jej sa obsah nemení. Ak Kus je väčší, než počet prvkov od pozície Začiatok do konca premennej Reťazec, potom sa menej znakov zmaže.
Zmažme prvé dva znaky reťazca:
Retazec := 'Izba' ; |
Delete(Retazec,1,2) ; { Retazec = 'ba'} |
Odrežme obsah reťazca od tretej pozície do konca:
Retazec := 'dobrodruh' ; |
Delete(Retazec,3,255) ; { Retazec = 'do'} |
Insert(Časť,Reťazec,Pozícia) ;
Procedúra, ktorá vloží do Reťazca od pozície Pozícia podreťazec Časť. Objekt Reťazec musí byť premennou, ktorý sa zmení - bude dlhší. Ak prvok Pozícia je väčší, než aktuálna dĺžka premennej Reťazec, potom jej sa obsah nemení. Ak Časť sa nezmestí do premennej Reťazec (dĺžka by bola po vložení väčšia, než je určená v deklarácii), potom výsledok sa na danú dĺžku skráti.
Vložme na začiatok reťazca znak #:
Retazec := '55' ; |
Insert('#',Retazec,1) ; { Retazec = '#55'} |
Vložme Retazec1 do premennej Retazec2:
Retazec1 := ' červené' ; |
Retazec2 := 'Mám auto.' ; |
Insert(Retazec1,Retazec2,4) ; { Retazec2 = 'Mám červené auto.' } |
Zdvojme prvú medzeru v reťazci:
Poz := Pos(' ',Retazec) ; { Retazec = 'Dobrá vec.' } |
If Poz <> 0 Then { Poz = 6 } |
Insert(' ',Retazec,Poz) ; { Retazec = 'Dobrá vec.' } |
Str(Číslo,Reťazec) ;
Táto procedúra konvertuje hodnotu daného čísla Číslo na reťazec Reťazec. Po čísle Číslo môžeme uviesť dĺžku zobrazenia, a v prípade reálneho čísla aj počet desatinných miest tak, ako v príkaze Write:
 |
Val(Reťazec,Číslo,Kód) ;
Táto procedúra konvertuje obsah premennej Reťazec typu String na číslo Číslo - je to obrátená procedúra k procedúre Str. Každé číslo dokážeme správne konvertovať na reťazec, ale nie každý reťazec sa dá konvertovať na číslo! Ak akcia bola úspešná, potom hodnota premennej Kód je 0. Ak akcia nebola úspešná, potom hodnota premennej Kód je pozícia prvého znaku, kde došlo k chybe a premenná Číslo zostáva nedefinovaná. Kód je povinne premenná typu Integer.
Úloha
Načítajme čísla. Koncovým znakom je '*'. Vypíšme ich súčet. Ak vstup nebol číslom - upozornime zvukovým efektom.
|
Čísla musíme načítať do premennej typu String. V opačnom prípade náš program by zhavaroval pri vstupe koncového znaku. Ak vstupom nie je hviezdička, potom ho pokúsime prekonvertovať na číslo. Ak akcia bola úspešná, potom dané číslo pričítame, inak dáme zvukové znamenie.
Úloha
Načítajme reťazec. Zameňme v ňom všetky medzery na znak malý krúžok · -jeho ASCII kód je 250!
|
Keďže dĺžka reťazca sa počas riešenia nemení - úlohu môžeme vyriešiť aj tak, že preveríme každý znak reťazca a ak treba urobíme požadovanú akciu:
Úloha
Načítajme reťazec. Zameňme v ňom všetky podreťazce "vpravo" na "vľavo"!
|
Túto úlohu nemôžeme riešiť pomocou cyklu FOR, lebo počas zámeny dĺžka reťazca sa mení! Činnosť opakujeme do tej doby, kým sa hľadaný podreťazec nachádza v reťazci.
 |
Túto úlohu môžeme ľahko zovšeobecniť, len musíme dať pozor na patričné dĺžky.
 |
Musíme dávať pozor na krajné možnosti - hlavne pri zovšeobecneniach! Napr. ak podreťazec nahrádzajúci pôvodný podreťazec obsahuje ho ako podreťazec - vyrobili by sme nekonečný cyklus. V takom prípade je vhodné vytvoriť nový reťazec a zámenu uskutočňovať zo začiatku reťazca:
Úloha
Načítajme číslo z danej pozície na obrazovke. Nech program akceptuje iba číslo, ktoré môže byť aj reálne, ale počet číslic v celej časti je maximálne 6. V opačnom prípade nech si pýta nové číslo. Ak sme zadali vhodné číslo, nech ho upravene zobrazí na mieste vstupu na dve desatinné miesta. Ostatné zrežme!
|
Pôvodný vstup, ak sa zmenil tvar, musíme zmazať z obrazovky.
Aby užívateľ nepokazil obrazovku, musíme mu znemožniť zadávanie väčšieho počtu znakov. V našom prípade počet znakov je 10 ak pripustíme aj znamienko. Takúto funkciu má procedúra
SetTextBuf(Input,Bufer,12) .
Preto sme použili 12, lebo do bufra sa má zapísať aj znak konca riadku - dvojznak CR a LF. Bufer je časť pamäte. Na jeho type nezáleží - podstatné je iba to, aby zaberalo v pamäti miesto 12 Byte.
|